package com.mlethe.library.utils.app;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.widget.Toast;

import androidx.annotation.DrawableRes;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.drawable.IconCompat;

/**
 * 快捷方式工具类
 * @author Mlethe
 */
public class ShortcutIconUtil {

    /**
     * 添加快捷方式
     * AndroidManifest.xml添加权限 com.android.launcher.permission.INSTALL_SHORTCUT
     * 8.0 以下需在AndroidManifest.xml里快捷方式启动的页面acitivity标签里添加android:exported="true"
     *
     * @param context       上下文
     * @param intent        快捷方式启动的页面
     * @param receiverClazz 创建成功回调（8..0以上）
     * @param name          快捷方式名称
     * @param resId         快捷方式图片
     */
    public static void add(Context context, Intent intent, Class<? extends BroadcastReceiver> receiverClazz, String name, @DrawableRes int resId) {
        if (context == null || intent == null) {
            return;
        }
        if (isExist(context, intent, name)) {
            Toast.makeText(context, "该应用桌面快捷方式已创建", Toast.LENGTH_SHORT).show();
            return;
        }
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
            // 不允许重建
            shortcut.putExtra("duplicate", false);
            // 设置名字，桌面快捷方式名称
            shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
            // 设置图标
            shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(context, resId));
            // 设置意图和快捷方式关联程序
            // 桌面图标和应用绑定，卸载应用后系统会同时自动删除图标
            intent.setAction(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);
            shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
            // 发送广播
            context.sendBroadcast(shortcut);
        } else {
            if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {
                // action必须设置，不然报错
                intent.setAction(Intent.ACTION_VIEW);
                ComponentName component = intent.getComponent();
                if (component == null) {
                    return;
                }
                String shortcutId = context.getPackageName() + "_" + component.getClassName();
                ShortcutInfoCompat info = new ShortcutInfoCompat.Builder(context, shortcutId)
                        .setIcon(IconCompat.createWithResource(context, resId))
                        .setShortLabel(name)
                        .setIntent(intent)
                        .build();
                // 当添加快捷方式的确认弹框弹出来时，将被回调
                Intent receiverIntent = null;
                if (receiverClazz != null) {
                    receiverIntent = new Intent(context, receiverClazz);
                }
                PendingIntent shortcutCallbackIntent = PendingIntent.getBroadcast(context, 0, receiverIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                ShortcutManagerCompat.requestPinShortcut(context, info, shortcutCallbackIntent.getIntentSender());
            }
        }
    }

    /**
     * 添加快捷方式
     * AndroidManifest.xml添加权限 com.android.launcher.permission.INSTALL_SHORTCUT
     * 8.0 以下需在AndroidManifest.xml里快捷方式启动的页面acitivity标签里添加android:exported="true"
     *
     * @param context       上下文
     * @param activityClazz 快捷方式启动的页面
     * @param receiverClazz 创建成功回调（8..0以上）
     * @param name          快捷方式名称
     * @param resId         快捷方式图片
     */
    public static void add(Context context, Class<? extends Activity> activityClazz, Class<? extends BroadcastReceiver> receiverClazz, String name, @DrawableRes int resId) {
        Intent intent = new Intent(context, activityClazz);
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        add(context, intent, receiverClazz, name, resId);
    }

    /**
     * 删除当前应用桌面快捷方式
     * AndroidManifest.xml添加权限 com.android.launcher.permission.UNINSTALL_SHORTCUT
     *
     * @param context
     */
    public static void delete(Context context, Intent intent, String name) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            Intent shortcut = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");
            shortcut.putExtra("duplicate", true);
            // 快捷方式名称
            shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
            // 桌面图标和应用绑定，卸载应用后系统会同时自动删除图标
            intent.setAction(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);
            shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
            context.sendBroadcast(shortcut);
        }
    }

    /**
     * 删除当前应用桌面快捷方式
     * AndroidManifest.xml添加权限 com.android.launcher.permission.UNINSTALL_SHORTCUT
     *
     * @param context
     */
    public static void delete(Context context, Class<? extends Activity> activityClazz, String name) {
        Intent intent = new Intent(context, activityClazz);
        delete(context , intent, name);
    }

    /**
     * 判断桌面快捷方式是否存在
     *
     * @param context
     */
    public static boolean isExist(Context context, Intent intent, String name) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            final String uriStr;
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) {
                // Android 2.1.x(API 7)以及以下的
                uriStr = "content://com.android.launcher.settings/favorites?notify=true";
            } else if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                // Android 4.4以下
                uriStr = "content://com.android.launcher2.settings/favorites?notify=true";
            } else {
                // 4.4以及以上
                uriStr = "content://com.android.launcher3.settings/favorites?notify=true";
            }
            final Uri uri = Uri.parse(uriStr);
            final Cursor c = context.getContentResolver().query(uri, null,
                    "title=?", new String[]{name}, null);
            if (c != null && c.getCount() > 0) {
                return true;
            }
        } else {
            ComponentName component = intent.getComponent();
            if (component == null) {
                return false;
            }
            String shortcutId = context.getPackageName() + "_" + component.getClassName();
            ShortcutManager shortcutManager = (ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
            for (ShortcutInfo info : shortcutManager.getPinnedShortcuts()) {
                if (shortcutId.equals(info.getId())) {
                    // 判断快捷方式是否已存在
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 判断桌面快捷方式是否存在
     *
     * @param context
     */
    public static boolean isExist(Context context, Class<? extends Activity> activityClazz, String name) {
        Intent intent = new Intent(context, activityClazz);
        return isExist(context, intent, name);
    }
}
